24-10 ヶeLぁ

我們可以使用 sendKeys() 函數來傳送鍵盤事件,這是一個很強大的功能,任何軟體只要能夠支援使用熱鍵來操作,我們就可以使用 WSH 來達到一模一樣的功能。

在下面這個範例,我們開啟 IE 並執行列印的動作:

原始檔(iePrint01.js):(灰色區域按兩下即可拷貝)
// 開啟 IE 並執行列印
// Roger Jang, 20081215, tested under Vista

// Step 1: 開啟 IE 並載入 Google 搜尋網頁
WshShell=new ActiveXObject("WScript.Shell");
WScript.Echo('Will open IE in 5 sec...'); WScript.Sleep(5000);
WshShell.Run("iexplore", 9);

// Step 2: 進行列印動作
WScript.Echo('Will click alt-d in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("%{d}");
WScript.Echo('Will send URL in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("http://www.google.com");
WScript.Echo('Will click alt-f in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("%{f}");
WScript.Echo('Will click p in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("p");
WScript.Echo('Will click enter in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("{ENTER}");
WScript.Echo('Will close the browser in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("%{F4}");

請注意在上述範例中,

以下列出一些特殊按鍵的相關呼叫方式:
按鑑 呼叫方式
SHIFT +
CONTROL ^
ALT %
LEFT ARROW {LEFT}
RIGHT ARROW {RIGHT}
UP ARROW {UP}
DOWN ARROW {DOWN}
{{{}
} {}}
[{[}
] {]}
~ {~}
+ {+}
^ {^}
% {%}
按鑑 呼叫方式
BACKSPACE {BACKSPACE}, {BS}, or {BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL or DELETE {DELETE} or {DEL}
END {END}
ENTER {ENTER} or ~
ESC {ESC}
HELP {HELP}
HOME {HOME}
INS or INSERT {INSERT} or {INS}
NUM LOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
PRINT SCREEN {PRTSC}
SCROLL LOCK {SCROLLLOCK}
TAB {TAB}
按鑑 呼叫方式
F1 {F1}
F2 {F2}
F3 {F3}
F4 {F4}
F5 {F5}
F6 {F6}
F7 {F7}
F8 {F8}
F9 {F9}
F10 {F10}
F11 {F11}
F12 {F12}
F13 {F13}
F14 {F14}
F15 {F15}
F16 {F16}

我們也可以開啟記事本並寫入文字:

原始檔(sendKeys01.js):(灰色區域按兩下即可拷貝)
// 使用 SendKeys 去開啟記事本並寫入文字、存檔於 junk.txt
// Roger Jang, 20081215, tested under Vista

outputFile="junk.txt";
WshShell=new ActiveXObject("WScript.Shell");
WshShell.Run("notepad", 9);	// Open notepad
WScript.Sleep(1000);		// Give Notepad some time to load
for (i=0; i<100; i++){
	WshShell.SendKeys(i+". Hello World!");
	WshShell.SendKeys("{ENTER}");
}
WshShell.SendKeys("%{F}");
WshShell.SendKeys("s");
WScript.Echo('Will input the file name in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys(outputFile);
//WshShell.SendKeys("{TAB}{TAB}{ENTER}");
WScript.Echo('Will save the file in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("%{s}");
WScript.Echo('Will click yes in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("%{y}");
WScript.Echo('Will close the file in 5 sec...'); WScript.Sleep(5000);
WshShell.SendKeys("%{F4}");

上述範例是一個很有趣的範例,讀者一定要親自試看看,才能體會使用WSH的「傳送鍵盤事件」可以達到的強大功能!

Hint
在上述範例中,我們可以將英文寫入記事本,但是若要將中文送入,就筆者的試驗來說,目前會出現亂碼。一個簡單的解決方案,就是先將中文送剪貼簿,再貼到記事本即可。

若要開啟 IE 並設定預設網頁,可見下列範例:

原始檔(sendKeys02.js):(灰色區域按兩下即可拷貝)
// 設定 IE 的預設網頁
// Roger Jang, 20081215, tested under Vista

WshShell=new ActiveXObject("WScript.Shell");
WshShell.Run("iexplore", 9);
WScript.Sleep(5000);		// 等待網頁載入
WshShell.SendKeys("%t");
WshShell.SendKeys("o");
WScript.Sleep(500);
WshShell.SendKeys("http://www.google.com");
WScript.Sleep(500);
for (i=0; i<13; i++)	// Make sure it's 13...
	WshShell.SendKeys("{TAB}");
WshShell.SendKeys("{ENTER}");
WScript.Sleep(500);

在下述範例中,我們利用記事本讀入一個文字檔,將文字檔的編碼方式改成 UTF-8,並另存新檔,如下:

原始檔(toUtf8.js):(灰色區域按兩下即可拷貝)
// 用法:cscript toUtf8.js file1 file2 file3 ...
// 功能:將 command line 所給的文字檔利用 notepad 轉成 utf-8 的格式
// 說明:
// 	如果輸入檔名是 test.txt,輸出檔名則是 text.txt_utf8
// 	注意:如果輸入檔名是相對路徑,則在使用前,必需確認 notepad 的預設儲存目錄是正確的目錄
// 	(若使用絕對路徑,則沒有上述顧慮。)

// 	Roger Jang, 20041125

args=WScript.Arguments;
if (args.Count()==0) {
	WScript.Echo("Usage: " + WScript.ScriptName + " file1 file2 file3 ...");
	WScript.Quit();
}

fso = new ActiveXObject("Scripting.FileSystemObject");

WshShell=new ActiveXObject("WScript.Shell");
WScript.Echo("Current directory: "+WshShell.CurrentDirectory);

// 列出所有的輸入參數
WScript.Echo("No. of arguments = " + WScript.Arguments.Count());
for (i=0; i<args.length; i++){
	WScript.Echo("args("+i+")="+args(i));
	targetFile=args(i)+"_utf8";
	WScript.Echo("targetFile="+targetFile);
	// Delete the targetFile if it exists
	if (fso.FileExists(targetFile)){
		WScript.Echo("Deleting "+targetFile);
		f = fso.GetFile(targetFile);
		f.Delete();
		WScript.Sleep(500);
	}

	WshShell.Run("notepad "+args(i), 9);
	WScript.Sleep(500);	// Give Notepad some time to load
	WshShell.SendKeys("%{F}");
	WshShell.SendKeys("a");
	WshShell.SendKeys(targetFile);
	WScript.Sleep(5000);
	WshShell.SendKeys("{TAB}{TAB}{TAB}");
	WshShell.SendKeys("{DOWN}{DOWN}{DOWN}{DOWN}");
	WshShell.SendKeys("{TAB}");
	WshShell.SendKeys("{ENTER}");
	WshShell.SendKeys("%{F4}");
	WScript.Sleep(1000);

	//改檔名:test.txt_utf8.txt ===> test.txt_utf8
//	fso.MoveFile(targetFile+".txt", targetFile);
	WScript.Sleep(1000);
}

若要測試下列範例,讀者可以輸入

cscript toUtf8.js test.txt 此時 WSH 會使用記事本來讀入 test.txt,將其編碼改為 UTF-8,並另存成 test.txt_utf8。若要檢視這兩個檔案的不同,可用網頁瀏覽器來顯示這兩個檔案,並由下拉選單「檢視/編碼」,就可以看出這兩個檔案在編碼上的不同。

Hint
利用 UTF-8 的編碼方式,就可以同時顯示各國不同的文字於同一個文字檔案。

其他與傳送鍵盤事件的相關說明,可見微軟的官方網頁: http://www.microsoft.com/technet/scriptcenter/guide/sas_wsh_hilv.mspx?mfr=true


JScript 程式設計與應用:用於單機的 WSH 環境